<?php

namespace app\api\controller\v2;

use app\admin\model\cms\MembershipExpiryRecordModel;
use app\admin\model\cms\OrderModel;
use app\admin\model\Score as ScoreModel;

use app\admin\model\UserGroup;
use app\common\model\Config;
use think\Db;
use think\Exception;
use app\common\controller\Api;
use think\Log;

/**
 * 积分支付
 * Class ScorePay
 * @package app\api\controller\v2
 */
class ScorePay extends Api
{
    //无需登录的方法,同时也就不需要鉴权了
    protected $noNeedLogin = [''];
    //无需鉴权的方法,但需要登录 *表示全部
    protected $noNeedRight = '*';

    //积分支付回调
    public function pay(){
        $order_id = $this->request->param('order_id','');
        $user = $this->auth->getUser();//用户信息
        if (!$order_id){
            $this->error('缺少参数');
        }
        //pay_type支付方式|1:微信,2:积分,3:临时申请订单(不用付费,只要后台管理员同意就行)
        $order = OrderModel::where('id',$order_id)
            ->where('user_id',$user['id'])
            ->where('pay_type',2)
            ->find();
        if(!$order || $order['price'] == 0){
            $this->error('订单信息不正确');
        }

        //订单已经支付 pay_status=0:尚未支付
        if ($order['pay_status'] == 1){
            $this->error('订单已支付,请勿重复支付');
        }

        //计算用户积分是否足够
        //查询用户积分余额
        $score = \app\admin\model\User::where('id',$user['id'])->value('score');
        //查配置项1元=多少积分
//        $score_exchange_rate = Config::where('name','score_exchange_rate')->value('value');
//        //判断积分是否足够支付订单,不足则返回错误
//        if ($score_exchange_rate <= 0) {
//            $this->error('积分配置不正确');
//        }
        //需要花费的积分
        if ($score < $order['price']){
            $this->error('积分不足');
        }

        Db::startTrans();
        try {
            //扣除用户积分
            $update_score =  bcsub($score,$order['price'],2);
            $user = Db::name('user')->find($user['id']);
            $user_update = Db::name('user')->where('id',$user['id'])->update(['score' => $update_score]);
            if (!$user_update){
                Db::rollback();
                $this->error('操作失败1');
            }
            //更新积分流水
            $comments = "order|支付订单号={$order['order_num']}";
            $success = \app\admin\model\Score::create([
                'user_id' => $user['id'],
                'change_type' => 12,//变动类型:1=注册,2=发帖,3=评论,4=转发,5=收藏,6=加精,7=置顶,8=被收藏,9=被转发,10=下载附件,11=观看视频,12=积分消费(购买会员、分类、内容之类的)'
                'change_num' => $order['price'],//变动数量
                'seq_flag' => 2,//变动方向:1=增加,2=减少
                'change_time' => time(),//变动时间
                'ref_sn' => $order['id'],//关联ID
                'table_name' => 'order',//关联ID所在的表名
                'comments' => $comments,//备注
                'show_notes' => '支付订单' . '-' . $order['price'],//显示说明
            ]);
            if (!$success){
                Db::rollback();
                $this->error('操作失败2');
            }
            //更新订单状态
            $update_order = OrderModel::where('id',$order['id'])->update([
                'pay_status' => 1,//订单支付状态|默认0:未支付,1:已支付
                'pay_time' => date('Y-m-d H:i:s'),//用户付款时间
                'pay_num' => '',//第三方订单号
                'cash_fee' => $order['price'],//用户实际支付金额(现金支付金额)
            ]);
            if (!$update_order){
                Db::rollback();
                $this->error('操作失败3');
            }
            $time = time();
            //判断是否购买的是会员组
            if ($order['goods_type'] == 'user_group'){
                $user_group = UserGroup::where('id',$order['goods_id'])->find();
                //判断会员分组的有效时长 0:无限天
                if ($user_group['membership_expiry'] == 0){
                    $period_of_validity = 1;//有效期|1=长期有效,0=无效,毫秒时间戳=有效时间
                }else{
                    $days = $user_group['membership_expiry']; // 指定的天数
                    //看当前会员是否过期 1=长期有效,0=无效,毫秒时间戳=有效时间
                    if ($user['period_of_validity'] > 1 || !$user['period_of_validity']){
                        if ($user['period_of_validity'] < time()){
                            $user['period_of_validity'] = 0;//毫秒
                        }
                        // 计算指定天数后的时间戳 秒
                        $specifiedTimestamp = strtotime("+{$days} days", ($user['period_of_validity'] / 1000) > 0 ? : $time) * 1000;//毫秒

                        $period_of_validity = $user['period_of_validity'] + $specifiedTimestamp;//单位毫秒
                    }elseif($user['period_of_validity'] == 1){
                        $period_of_validity = 1;//会员有效期(到期时间)|1=长期有效,0=无效,毫秒时间戳=有效时间
                    }
                }

                $user_success = \app\admin\model\User::where('id',$order['user_id'])->update([
                    'group_id'=>$order['goods_id'],//会员组别id
                    'member_type'=>'member',//会员类型|tourist=游客,TrialMember=试用会员，member=正式会员'
                    'member_make_time'=>time(),//会员开通时间
                    'period_of_validity'=>$period_of_validity,//会员有效期(到期时间)|1=长期有效,0=无效,毫秒时间戳(13位)=有效时间
                ]);
                if (!$user_success){
                    Db::rollback();
                    $this->error('操作失败4');
                    //dd("{user表id={$order['user_id']}微信回调成功,但更应用户信息失败" , 'error');//记录日志
                }
            }else{
                //购买分类/文章内容
                $membership_Expiry_record_model = MembershipExpiryRecordModel::where('user_id',$order['user_id'])
                    ->where('goods_type',$order['goods_type'])
                    ->where('table_name',$order['table_name'])
                    ->where('goods_id',$order['goods_id'])
                    ->order('id','desc')
                    ->find();
                //判断之前是否购买过
                $expiration_time = 0;//剩余时长|没买过就默认为0
                if ($membership_Expiry_record_model){
                    //是,时间叠加
                    $expiration_time = $membership_Expiry_record_model['expiration_time'] - $time;
                    if ($expiration_time <= 0){
                        $expiration_time = 0;
                    }
                }
                //获取订单所购买的会员时长(天)|0:无限天
                $old_membership_duration = $order['membership_duration'] ?? 0;
                if ($order['membership_duration']){
                    $old_membership_duration = $order['membership_duration'] * 24 * 60 *60 + $time;
                }
//                创建
                $data_2 = [
                    'user_id'=>$order['user_id'],
                    'order_id'=>$order['id'],
                    'goods_type'=>$order['goods_type'],
                    'table_name'=>$order['table_name'],
                    'goods_id'=>$order['goods_id'],
                    'membership_duration'=>$order['membership_duration'],
                    'expiration_time'=>$expiration_time + $old_membership_duration,
                ];
                $success_2 = MembershipExpiryRecordModel::create($data_2);//创建会员过期记录表,查询数据的时候每次获取最后一条
                if (!$success_2){
                    Db::rollback();
                    $this->error('操作失败5');
                    //dd("{membership_expiry_record表order_id={$order['id']}在微信支付成功回调中创建失败" , 'error');//记录日志
                }
            }
            Db::commit();
        }catch (Exception $e){
            Db::rollback();
            $this->error('操作失败6'.$e->getMessage());
        }
        $this->success('操作成功');
    }

}
